/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Ultima revision: $Rev: 22 $
 *      Fecha: $Date: 2011-10-31 01:12:10 +0000 (Mon, 31 Oct 2011) $
 * 
 * Archivo: ServidorDatosCSV.java
 */


package Datos.CSV;

import Servicios.*;
import java.util.ArrayList;
import java.util.HashSet;

/**
 * Implementa a un iServidor para ser utilizado con las categorias de Datos
 * del Usuario.
 * 
 * @author Jorge
 * @author Jonathan
 */
public class ServidorDatosCSV implements iServidor, ConstantesCSV{
    final private String nombreCategoria;
    final private Usuario usuario;
    final private ArchivoCSV datos;
    private ArrayList<String> nombreServicios = new ArrayList<String>();

    /**
     * Constructor, inicializa todos los datos.
     * @param nombreCategoria Nombre de la Categoria que este Servidor representa.
     * @param usuario Usuario que se estara utilizando.
     * @param datos Archivo de datos a leer y escribir.
     */
    public ServidorDatosCSV(String nombreCategoria, Usuario usuario, ArchivoCSV datos) {
        this.nombreCategoria = nombreCategoria;
        this.usuario = usuario;
        this.datos = datos;
        
        /* Obtiene todos los nombres de servicios relacionados al usuario
         * en la categoria.
         */
        HashSet<String> setServicios = new HashSet<String>();
        for (int i = 0; i < datos.obtenerCantidadLineas(); i++) {
            String[] linea =  datos.obtenerLinea(i);
            if( linea[idxCategoria].equals(nombreCategoria) ){
                setServicios.add( linea[idxNombreServicio] );
            }
        }
        nombreServicios.addAll( setServicios );
        
    }
    
    @Override
    public boolean agregarNuevoServicio(String nombreServicio) {
        // Verificar que el servicio no se encuentre contenido
        if( nombreServicios.contains( nombreServicio ) ){
            return false;
        }
        else{
            nombreServicios.add(nombreServicio);
            return true;
        }
    }

    @Override
    public iEnlace obtenerEnlace(String nombreServicio) {
        // Revisar que el servicio exista
        if( !nombreServicios.contains(nombreServicio) )
            return null;
        else
            return new EnlaceDatosCSV( datos, usuario,
                nombreCategoria, nombreServicio );
    }

    @Override
    public String obtenerNombreCategoria() {
        return nombreCategoria;
    }

    @Override
    public String[] obtenerServiciosRegistrados() {
        return nombreServicios.toArray( new String[0] );
    }

    /**
     * Prueba si dos iServidores son iguales
     * @param obj
     * @return 
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ServidorDatosCSV other = (ServidorDatosCSV) obj;
        if ((this.nombreCategoria == null) ? (other.nombreCategoria != null) : !this.nombreCategoria.equals(other.nombreCategoria)) {
            return false;
        }
        if (this.usuario != other.usuario && (this.usuario == null || !this.usuario.equals(other.usuario))) {
            return false;
        }
        if (this.datos != other.datos && (this.datos == null || !this.datos.equals(other.datos))) {
            return false;
        }
        if (this.nombreServicios != other.nombreServicios && (this.nombreServicios == null || !this.nombreServicios.equals(other.nombreServicios))) {
            return false;
        }
        return true;
    }
}
